package main

import (
	"fmt"
	"regexp"
	"time"

	"github.com/gocolly/colly"
)

var visited = map[string]bool{}

func main() {
	c := colly.NewCollector(
		colly.AllowedDomains("www.abcdefg.com"),
		colly.MaxDepth(1),
	)
	// 匹配该网站的详情页面
	detailRegex, _ := regexp.Compile(`/go/go\p=\d+$`)
	listRegex, _ := regexp.Compile(`/t/\d+#\w+`)
	// 所有啊标签, 上设置回调函数
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		link := e.Attr("href")
		// 已经访问过的详情页面或者列表页面跳过
		if visited[link] && (detailRegex.Match([]byte(link))) || listRegex.Match([]byte(link)) {
			return
		}

		// 既不是列表页面, 也不是详情页面, 就不是我们关心的页面, 则跳过
		if !detailRegex.Match([]byte(link)) && !listRegex.Match([]byte(link)) {
			println("not match", link)
			return
		}

		// 因为大多数的网站有返爬虫策略,所有爬虫的逻辑代码中应该有sleep逻辑以避免被封杀
		time.Sleep(time.Second)
		println("match", link)
		visited[link] = true
		time.Sleep(time.Millisecond * 2)
		c.Visit(e.Request.AbsoluteURL(link))
	})

	err := c.Visit("https://www.abcdefg.com/go/go")
	if err != nil {
		fmt.Println(err)
	}

}
